#ifndef __THREAD_H__
#define __THREAD_H__

#include <ucontext.h>
#include <valgrind/valgrind.h>
/* identifiant de thread
 * NB: pourra être un entier au lieu d'un pointeur si ca vous arrange,
 *     mais attention aux inconvénient des tableaux de threads
 *     (consommation mémoire, cout d'allocation, ...).
 */
typedef struct thread_s {
  ucontext_t t;//laisser ce champ en début de structure
  int status;
  int id;
  int valgrind;
  void* ret;
} thread_t ;

typedef struct thread_list {
  thread_t *thread;
  struct thread_list *next;
  unsigned int num;
} thread_list;

/* recuperer l'identifiant du thread courant.
 */
extern thread_t thread_self(void);

/* creer un nouveau thread qui va exécuter la fonction func avec l'argument funcarg.
 * renvoie 0 en cas de succès, -1 en cas d'erreur.
 */
extern int thread_create(thread_t *newthread, void *(*func)(void *), void *funcarg);

/* passer la main à un autre thread.
 */
extern int thread_yield(void);

/* attendre la fin d'exécution d'un thread.
 * la valeur renvoyée par le thread est placée dans *retval.
 * si retval est NULL, la valeur de retour est ignorée.
 */
extern int thread_join(thread_t *thread, void **retval);

/* terminer le thread courant en renvoyant la valeur de retour retval.
 * cette fonction ne retourne jamais.
 */
extern void thread_exit(void *retval);// __attribute__ ((__noreturn__));


thread_t* current_thread;
thread_t* thread_remove;
thread_list* list_thread;
int main_initialized;

#endif /* __THREAD_H__ */

